Sveobuhvatan vodiÄ za distribuciju Python paketa putem PyPI-ja, koji pokriva najbolje prakse upravljanja verzijama, alate i tijekove rada za globalne programere.
Distribucija Python paketa: Objavljivanje na PyPI-ju i upravljanje verzijama
OpseĆŸni ekosustav Pythona pokreÄe ogromna zbirka paketa, lako dostupnih putem Python Package Indexa (PyPI). Ovaj vodiÄ pruĆŸa sveobuhvatan pregled kako distribuirati vlastite Python pakete putem PyPI-ja, osiguravajuÄi da budu dostupni programerima diljem svijeta. IstraĆŸit Äemo osnovne alate, najbolje prakse za upravljanje verzijama i tijekove rada za stvaranje i objavljivanje visokokvalitetnih Python paketa.
ZaĆĄto distribuirati svoj Python paket?
Distribucija vaĆĄeg Python paketa nudi brojne prednosti:
- Dijeljenje vaĆĄeg rada: OmoguÄuje drugim programerima da lako ponovno koriste vaĆĄ kod, potiÄuÄi suradnju i inovacije. Zamislite globalni tim koji koristi vaĆĄe specijalizirane alate za analizu podataka izgraÄene u Pythonu.
- Upravljanje ovisnostima: Pojednostavljuje proces upravljanja ovisnostima u drugim projektima. VaĆĄ paket moĆŸe se instalirati jednom naredbom, zajedno sa svim svojim ovisnostima.
- Doprinos otvorenom kodu: OmoguÄuje vam da doprinesete zajednici otvorenog koda i steknete priznanje za svoj rad. Mnoge kljuÄne softverske komponente su paketi otvorenog koda koje odrĆŸavaju programeri diljem svijeta.
- Kontrola verzija i aĆŸuriranja: PruĆŸa strukturiran naÄin za upravljanje verzijama, izdavanje aĆŸuriranja i rjeĆĄavanje greĆĄaka. To osigurava da korisnici uvijek imaju pristup najnovijoj i najpouzdanijoj verziji vaĆĄeg paketa.
- Jednostavna instalacija: Pojednostavljuje instalaciju za korisnike putem
pip install ime-vaseg-paketa.
Osnovni alati za distribuciju Python paketa
Nekoliko alata je kljuÄno za stvaranje i distribuciju Python paketa:
- setuptools: Ć iroko koriĆĄtena biblioteka za definiranje metapodataka paketa, ukljuÄujuÄi naziv, verziju, ovisnosti i ulazne toÄke. To je de facto standard za pakiranje Python projekata.
- wheel: Format distribucije koji pruĆŸa uÄinkovitiji i pouzdaniji proces instalacije u usporedbi s izvornim distribucijama. Wheelovi su unaprijed izgraÄene distribucije koje se mogu instalirati bez potrebe za kompajliranjem.
- twine: Alat za sigurno postavljanje vaĆĄeg paketa na PyPI. Twine kriptira vaĆĄe vjerodajnice i podatke paketa tijekom prijenosa, ĆĄtiteÄi od prisluĆĄkivanja i "man-in-the-middle" napada.
- venv/virtualenv: Ovo su alati za stvaranje izoliranih Python okruĆŸenja. KoriĆĄtenje virtualnih okruĆŸenja kljuÄno je za upravljanje ovisnostima i izbjegavanje sukoba izmeÄu razliÄitih projekata.
Postavljanje vaĆĄeg projekta
Prije nego ĆĄto moĆŸete distribuirati svoj paket, morate ispravno strukturirati svoj projekt.
Primjer strukture projekta
moj_paket/ âââ moj_paket/ â âââ __init__.py â âââ modul1.py â âââ modul2.py âââ tests/ â âââ __init__.py â âââ test_modul1.py â âââ test_modul2.py âââ README.md âââ LICENSE âââ setup.py âââ .gitignore
ObjaĆĄnjenje:
- moj_paket/: Glavni direktorij koji sadrĆŸi izvorni kod vaĆĄeg paketa.
- moj_paket/__init__.py: Äini direktorij
moj_paketPython paketom. MoĆŸe biti prazan ili sadrĆŸavati inicijalizacijski kod. - moj_paket/modul1.py, moj_paket/modul2.py: VaĆĄi Python moduli koji sadrĆŸe stvarni kod.
- tests/: Direktorij koji sadrĆŸi vaĆĄe jediniÄne testove. KljuÄno je napisati testove kako bi se osigurala kvaliteta i pouzdanost vaĆĄeg paketa.
- README.md: Markdown datoteka koja pruĆŸa opis vaĆĄeg paketa, upute za koriĆĄtenje i druge relevantne informacije. Ovo je Äesto prva stvar koju korisnici vide na PyPI-ju.
- LICENSE: Datoteka koja sadrĆŸi licencu pod kojom se vaĆĄ paket distribuira (npr. MIT, Apache 2.0, GPL). Odabir odgovarajuÄe licence kljuÄan je za specificiranje kako drugi mogu koristiti vaĆĄ kod.
- setup.py: Glavna konfiguracijska datoteka koja definira metapodatke vaĆĄeg paketa i upute za izgradnju.
- .gitignore: Specificira datoteke i direktorije koje Git treba ignorirati (npr. privremene datoteke, artefakti izgradnje).
Stvaranje `setup.py` datoteke
setup.py datoteka je srce distribucije vaĆĄeg paketa. SadrĆŸi metapodatke o vaĆĄem paketu i upute za njegovu izgradnju i instalaciju. Evo primjera:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="moj_paket", # Zamijenite s nazivom vaĆĄeg paketa
version="0.1.0",
author="VaĆĄe Ime", # Zamijenite sa svojim imenom
author_email="vas.email@example.com", # Zamijenite sa svojim emailom
description="Mali primjer paketa",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/vasekorisnickoime/moj_paket", # Zamijenite s URL-om vaĆĄeg repozitorija
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
install_requires=[
"requests", # Primjer ovisnosti
],
)
ObjaĆĄnjenje:
- name: Naziv vaĆĄeg paketa, koji Äe se koristiti na PyPI-ju. Odaberite jedinstven i deskriptivan naziv.
- version: Broj verzije vaĆĄeg paketa. Slijedite semantiÄko verzioniranje (pogledajte ispod).
- author, author_email: VaĆĄe ime i email adresa.
- description: Kratak opis vaĆĄeg paketa.
- long_description: DuĆŸi, detaljniji opis, obiÄno proÄitan iz vaĆĄe `README.md` datoteke.
- long_description_content_type: OdreÄuje format vaĆĄeg dugog opisa (npr. "text/markdown").
- url: URL poÄetne stranice vaĆĄeg paketa (npr. GitHub repozitorij).
- packages: Popis paketa koje treba ukljuÄiti u vaĆĄu distribuciju. `setuptools.find_packages()` automatski pronalazi sve pakete u vaĆĄem projektu.
- classifiers: Metapodaci koji pomaĆŸu korisnicima da pronaÄu vaĆĄ paket na PyPI-ju. Odaberite odgovarajuÄe klasifikatore s popisa Trove klasifikatora. Razmislite o ukljuÄivanju klasifikatora za podrĆŸane verzije Pythona, operativne sustave i licence.
- python_requires: OdreÄuje minimalnu verziju Pythona potrebnu za koriĆĄtenje vaĆĄeg paketa.
- install_requires: Popis ovisnosti koje vaĆĄ paket zahtijeva. Te Äe se ovisnosti automatski instalirati kada se instalira vaĆĄ paket.
Upravljanje verzijama: SemantiÄko verzioniranje
SemantiÄko verzioniranje (SemVer) je ĆĄiroko prihvaÄena shema verzioniranja koja pruĆŸa jasan i dosljedan naÄin komuniciranja prirode promjena u vaĆĄem paketu.
SemVer broj verzije sastoji se od tri dijela: GLAVNA.MANJA.ZAKRPA.
- GLAVNA (MAJOR): PoveÄava se kada napravite nekompatibilne promjene API-ja. To ukazuje na znaÄajnu promjenu koja moĆŸe zahtijevati od korisnika da aĆŸuriraju svoj kod.
- MANJA (MINOR): PoveÄava se kada dodate funkcionalnost na naÄin koji je kompatibilan s prethodnim verzijama. To oznaÄava nove znaÄajke ili poboljĆĄanja koja ne naruĆĄavaju postojeÄi kod.
- ZAKRPA (PATCH): PoveÄava se kada napravite ispravke greĆĄaka koje su kompatibilne s prethodnim verzijama. Ovo je za male popravke koji ne dodaju nove znaÄajke niti naruĆĄavaju postojeÄu funkcionalnost.
Primjeri:
- 1.0.0: PoÄetno izdanje.
- 1.1.0: Dodana je nova znaÄajka bez naruĆĄavanja postojeÄeg koda.
- 1.0.1: Ispravljena je greĆĄka u izdanju 1.0.0.
- 2.0.0: Napravljene su nekompatibilne promjene API-ja.
KoriĆĄtenje SemVer-a pomaĆŸe korisnicima da razumiju utjecaj nadogradnje na novu verziju vaĆĄeg paketa.
Izgradnja vaĆĄeg paketa
Nakon ĆĄto konfigurirate svoju `setup.py` datoteku, moĆŸete izgraditi svoj paket.
- Stvorite virtualno okruĆŸenje: PreporuÄuje se stvaranje virtualnog okruĆŸenja kako biste izolirali ovisnosti vaĆĄeg paketa. Koristite `python3 -m venv .venv` (ili `virtualenv .venv`), a zatim ga aktivirajte (`source .venv/bin/activate` na Linuxu/macOS-u, `.venv\Scripts\activate` na Windowsima).
- Instalirajte ovisnosti za izgradnju: Pokrenite `pip install --upgrade setuptools wheel`.
- Izgradite paket: Pokrenite `python setup.py sdist bdist_wheel`. Ova naredba stvara dvije distribucijske datoteke u direktoriju `dist`: izvornu distribuciju (sdist) i wheel distribuciju (bdist_wheel).
`sdist` sadrĆŸi vaĆĄ izvorni kod i `setup.py` datoteku. `bdist_wheel` je unaprijed izgraÄena distribucija koja se moĆŸe brĆŸe instalirati.
Objavljivanje vaĆĄeg paketa na PyPI
Prije nego ĆĄto moĆŸete objaviti svoj paket, morate stvoriti raÄun na PyPI-ju (https://pypi.org/) i stvoriti API token. Taj Äe se token koristiti za provjeru autentiÄnosti vaĆĄih prijenosa.
- Registrirajte se na PyPI: Idite na https://pypi.org/account/register/ i stvorite raÄun.
- Stvorite API token: Idite na https://pypi.org/manage/account/, pomaknite se do odjeljka "API tokens" i stvorite novi token. Sigurno pohranite ovaj token jer Äe vam trebati za prijenos paketa.
- Instalirajte Twine: Pokrenite `pip install twine`.
- Prenesite svoj paket: Pokrenite `twine upload dist/*`. Bit Äete upitani za korisniÄko ime (
__token__) i lozinku (API token koji ste stvorili).
VaĆŸna sigurnosna napomena: Nikada nemojte pohranjivati svoj API token u svoj repozitorij. Pohranite ga na sigurno i koristite varijable okruĆŸenja ili druge sigurne metode za pristup tijekom procesa prijenosa.
Testiranje instalacije vaĆĄeg paketa
Nakon objavljivanja vaĆĄeg paketa, kljuÄno je testirati moĆŸe li se ispravno instalirati.
- Stvorite novo virtualno okruĆŸenje: To osigurava da testirate instalaciju u Äistom okruĆŸenju.
- Instalirajte svoj paket: Pokrenite `pip install ime-vaseg-paketa`.
- Uvezite i koristite svoj paket: U Python interpreteru uvezite svoj paket i provjerite radi li kako je oÄekivano.
Kontinuirana integracija i kontinuirana isporuka (CI/CD)
Za automatizaciju procesa izgradnje, testiranja i objavljivanja vaĆĄeg paketa, moĆŸete koristiti CI/CD alate kao ĆĄto su GitHub Actions, GitLab CI ili Travis CI.
Evo primjera tijeka rada (workflow) za GitHub Actions koji gradi i objavljuje vaĆĄ paket na PyPI:
name: Publish to PyPI
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.x
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build package
run: python setup.py sdist bdist_wheel
- name: Publish package to PyPI
run: |
twine upload dist/* \
-u __token__ \
-p ${{ secrets.PYPI_API_TOKEN }}
ObjaĆĄnjenje:
- Ovaj tijek rada pokreÄe se kada se na GitHubu objavi novo izdanje.
- Provjerava kod, postavlja Python, instalira ovisnosti, gradi paket i prenosi ga na PyPI.
secrets.PYPI_API_TOKENje GitHub tajna (secret) koja pohranjuje vaĆĄ PyPI API token. Morate konfigurirati ovu tajnu u postavkama vaĆĄeg GitHub repozitorija.
Najbolje prakse za distribuciju Python paketa
- NapiĆĄite sveobuhvatnu dokumentaciju: UkljuÄite detaljnu `README.md` datoteku, kao i API dokumentaciju koristeÄi alate poput Sphinxa. Jasna i potpuna dokumentacija kljuÄna je kako bi vaĆĄ paket bio jednostavan za koriĆĄtenje.
- PiĆĄite jediniÄne testove: Temeljito testirajte svoj kod kako biste osigurali njegovu kvalitetu i pouzdanost. Koristite okvire za testiranje poput pyquesta ili unittesta.
- Slijedite smjernice stila PEP 8: PridrĆŸavajte se vodiÄa za stil Python Enhancement Proposal 8 (PEP 8) kako biste osigurali dosljedan i Äitljiv kod.
- Koristite licencu: Odaberite odgovarajuÄu licencu otvorenog koda kako biste specificirali kako drugi mogu koristiti vaĆĄ kod.
- OdrĆŸavajte ovisnosti aĆŸurnima: Redovito aĆŸurirajte ovisnosti vaĆĄeg paketa kako biste iskoristili ispravke greĆĄaka, sigurnosne zakrpe i nove znaÄajke.
- Koristite virtualno okruĆŸenje: Uvijek razvijajte i testirajte svoj paket unutar virtualnog okruĆŸenja kako biste izolirali ovisnosti.
- Razmotrite internacionalizaciju (i18n) i lokalizaciju (l10n): Ako vaĆĄ paket obraÄuje tekst ili podatke vidljive korisnicima, razmislite o prilagodbi razliÄitim jezicima i regijama. To proĆĄiruje vaĆĄu potencijalnu bazu korisnika na globalnoj razini. Alati poput Babela mogu pomoÄi u tome.
- Rukujte razliÄitim vremenskim zonama i valutama: Ako se vaĆĄ paket bavi datumima, vremenima ili financijskim transakcijama, budite svjesni razliÄitih vremenskih zona i valuta diljem svijeta. Koristite odgovarajuÄe biblioteke i API-je za ispravno rukovanje tim sloĆŸenostima.
- PruĆŸite jasne poruke o greĆĄkama: PiĆĄite informativne poruke o greĆĄkama koje pomaĆŸu korisnicima da shvate ĆĄto je poĆĄlo po zlu i kako to popraviti. Prevedite te poruke na razliÄite jezike ako je moguÄe.
- RazmiĆĄljajte o pristupaÄnosti: Uzmite u obzir korisnike s invaliditetom pri dizajniranju suÄelja i dokumentacije vaĆĄeg paketa. Slijedite smjernice za pristupaÄnost kako biste osigurali da je vaĆĄ paket upotrebljiv svima.
Napredne teme
- Namespace paketi: OmoguÄuju vam da podijelite jedan Python paket na viĆĄe direktorija ili Äak viĆĄe distribucija.
- Ulazne toÄke (Entry points): OmoguÄuju vam definiranje funkcija ili klasa koje se mogu pozvati iz drugih paketa ili s naredbenog retka.
- Datoteke s podacima: OmoguÄuju vam ukljuÄivanje datoteka koje nisu Python kod (npr. datoteke s podacima, konfiguracijske datoteke) u vaĆĄu distribuciju.
- Uvjetne ovisnosti: OmoguÄuju vam da specificirate ovisnosti koje su potrebne samo pod odreÄenim uvjetima (npr. na odreÄenom operativnom sustavu).
ZakljuÄak
Distribucija vaĆĄeg Python paketa na PyPI-ju sjajan je naÄin da podijelite svoj rad sa svijetom i doprinesete Python ekosustavu. SlijedeÄi korake i najbolje prakse navedene u ovom vodiÄu, moĆŸete stvoriti i objaviti visokokvalitetne Python pakete koji su jednostavni za instalaciju, koriĆĄtenje i odrĆŸavanje. Ne zaboravite dati prioritet jasnoj dokumentaciji, temeljitom testiranju i dosljednom upravljanju verzijama kako biste osigurali uspjeh vaĆĄeg paketa.